package urjc.as.emergencies.resources;

import org.restlet.Context;
import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.Representation;
import org.restlet.resource.ResourceException;
import org.restlet.resource.Variant;

import urjc.as.emergencies.data.PatientRecord;

/**
 * Restlet para manejar las peticiones que se envian contra el recurso historial
 * asociado a una misión concreta.
 * 
 * @author Helanacb
 * @author ahiges
 * 
 */
public class PatientRecordResource extends BaseResource {
	
	public PatientRecordResource(Context context, Request request, Response response) {
		super(context, request, response);

		// Variantes de representación soportadas
		getVariants().add(new Variant(MediaType.TEXT_XML));
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.restlet.resource.Resource#allowDelete()
	 */
	@Override
	public boolean allowDelete() {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.restlet.resource.Resource#allowGet()
	 */
	@Override
	public boolean allowGet() {
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.restlet.resource.Resource#allowPost()
	 */
	@Override
	public boolean allowPost() {
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.restlet.resource.Resource#allowPut()
	 */
	@Override
	public boolean allowPut() {
		return true;
	}
	
	public boolean allowPatch() {
		return true;
	}

	// Handlers

	public void handlePatch() throws ResourceException {
		getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
		
		// 1) Obtenemos el recurso misión
		PatientRecord historial = (PatientRecord) getStorage().getEntity(
				getRequest().getResourceRef().getBaseRef().toString());

		// 2) Procesamos el patch
		Form form = getRequest().getEntityAsForm();

		// 2.1 Es un patch para Alergias
		String allergies = form.getFirstValue(PatientRecord.ALLERGIES);
		if (allergies != null) {
			historial.setAlergias(allergies);
			getResponse().setStatus(Status.SUCCESS_OK);
		}
		// 2.2 Es un patch para las Enfermedades
		String diseases = form.getFirstValue(PatientRecord.DISEASES);
		if (diseases != null) {
			historial.setEnfermedades(diseases);
			getResponse().setStatus(Status.SUCCESS_OK);
		}
		
		// 2.3 Es un patch para medicamentos
		String medicines = form.getFirstValue(PatientRecord.MEDICINES);
		if (medicines != null) {
			historial.setMedicamentos(medicines);
			getResponse().setStatus(Status.SUCCESS_OK);
		}

	}

	/* (non-Javadoc)
	 * @see org.restlet.resource.Resource#storeRepresentation(org.restlet.resource.Representation)
	 */
	@Override
	public void storeRepresentation(Representation entity)
			throws ResourceException {
		
		try {
			if (entity.getMediaType().equals(MediaType.TEXT_XML)) {
				// Inicializa la misión
				String xmlHistorial = getRequest().getEntity().getText();
				PatientRecord newHistorial = (PatientRecord) PatientRecord.deserializar(xmlHistorial);

				// Almaceno
				getStorage().addEntity(newHistorial);
				getResponse().setLocationRef(newHistorial.getUri());
			} else {
				throw new ResourceException(
						Status.CLIENT_ERROR_UNSUPPORTED_MEDIA_TYPE);
			}

			// Si todo va bien, envía: (201 -- Created)
			getResponse().setStatus(Status.SUCCESS_CREATED);
		} catch (Exception e) {
			// Si saltan excepciones porque el destinatario no existe,
			// entonces:
			throw new ResourceException(Status.CLIENT_ERROR_BAD_REQUEST);
		}
	}
	
	

}
